package priv.utrix.micro.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 幂等注解
 * <p>如果那个接口需要实现幂等，在接口上加上此注解即可实现幂等。
 * 注意：因为用的是分布式redisson锁，所以性能相对于乐观锁上会差一些，但是可以
 * 保证数据无侵入。因为锁的key值是此注解标注的方法名，即(类名.方法名), 所以
 * 同一个类中的重载方法不可同时使用。</p>
 *
 * @author utrix
 * @date 2020/11/28
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {

    /**
     * 过期时间, 默认20秒
     * <p>
     *     过期时间必须大于等于方法的执行时间，否则会异常:
     *     java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id
     * </p>
     */
    long expireTime() default 20;

    /**
     * 默认过期时间单位秒
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;
}
